package com.study.java8.char07;
// hiding/Lunch.java
// Demonstrates class access specifiers. Make a class
// effectively private with private constructors:

class Soup1 {
    private Soup1() {
    }

    /**
     * 在 Soup1 中，有一个 static 方法，它的作用是创建一个新的 Soup1 对象并返回对象的引用。
     * 如果想要在返回引用之前在 Soup1 上做一些额外操作，或是记录创建了多少个 Soup1 对象（可以用来限制数量），
     * 这种做法是有用的。
     * @return
     */
    public static Soup1 makeSoup() { // [1]
        return new Soup1();
    }
}

class Soup2 {
    private Soup2() {
    }

    private static Soup2 ps1 = new Soup2(); // [2]

    public static Soup2 access() {
        return ps1;
    }

    public void f() {
    }
}

// Only one public class allowed per file:
public class Lunch {
    void testPrivate() {
        // Can't do this! Private constructor:
        //- Soup1 soup = new Soup1();
    }

    void testStatic() {
        Soup1 soup = Soup1.makeSoup();
    }

    void testSingleton() {
        Soup2.access().f();
    }
}